我們先來回顧前幾天聊的:
流浪漢-- Vagrant 的文章回顧:
碼頭工人-- Docker 的文章回顧:
這兩個技術都能達成下列目的:
那該如何應用這些技術在 CI 上呢?回想 Day 2 提到寫 Hello World 程式要做的六個步驟,試著把上面的結果套進這六個步驟:
而準備環境、佈署程式、測試程式這三個步驟,正是這兩個技術發揮強項的地方。以下就請各方代表說一下,他們如何為開發者做到這三件事:
Vagrant 使用 Hypervisor 雖然資源佔用的比 Docker 多,但它使用上的概念較容易理解。說穿了嘛, Vagrant 的本質其實就是 VM ,至於使用哪種 VM 則是 Provider 決定,大多都是使用 VirtualBox 。
準備環境
Vagrant 使用 Vagrantfile
來配置環境,換句話說,只要環境裝好 Vagrant 和 Provider ,加上 Vagrantfile
即可建置環境。它由 Ruby 所撰寫,所以可以使用程式語法處理某些配置任務。
佈署程式
Hypervisor 模擬出來的是一個獨立環境,修改程式並不會影響這個獨立環境。而 Vagrant 提供了 synced_folder
參數,讓外界資料夾與獨立環境的某個資料夾做同步,只要進去執行佈署指令即可把程式佈到環境。
測試程式
Vagrant 環境建置不難,且每次建置的結果會是一致的。因此非常適合使用在測試上,只要環境被搞壞或是測試結束,都能安心把虛擬機砍掉重練,完全不用害怕。要在其他電腦上重現結果,也非常地方便。需要查詢系統 Log 記錄,因 Vagrant 就是一台 Linux , SSH 進去把它當 Linux 用即可。
Vagrant 環境的基礎是使用 Hypervisor 建立出來的 VM ,資源較獨立,但就是很吃資源。除非是特殊場合不能直接使用 Docker 外(如 Windows 7 ),其他都會建議使用 Vagrant 做開發,將會方便許多。另外, Vagrant 概念較好懂,也比較沒有資源共用的問題,學習容易。這也可以列入考慮的因素。
Docker 是容器化技術,資源佔用較小,同樣的實體機可以開出更多容器。雖然很像 Vagrant ,用起來也很像,即使 Docker 與 Vagrant 有指令或概念上的對照表,但記得,這兩個是不一樣的。
準備環境
Docker 使用 Dockerfile
定義容器環境;使用 Docker Build 建置 Image ;最後使用 Docker Run 建立容器並執行。這樣就是一個完整的環境準備過程。其中 Image 還可以進一步放在 Docker Hub 供其他團隊成員或更多人下載,可提升環境一致性,同時也省下了 Docker Build 的時間。
佈署程式
容器建議要有的特色之一--不可變的,因此通常佈署程式的過程會被定義在 Dockerfile
裡,在準備環境的過程中就會做佈署,而不是容器開好再另外佈署。另一種方法是使用 Volume Mapping ,是一個類似資料夾同步的方法,可以把外部程式碼同步進容器內。但這會比較像是 Workaround 的做法,還是建議定義在 Dockerfile
內較好。
測試程式
Docker Run 可以啟動容器,即可對容器執行測試。容器資源消耗少,甚至還可以做平行化測試。 Docker 的 Log 建議用 stdout 輸出,可以直接用 docker logs
查詢,非常方便。
Docker 建立在 Linux 64-bit 上,即使 Windows / Mac 有出 Native Docker Engine ,但許多舊版都不支援。因此環境需求建議還是限制在會用 Linux 上會比較好。另外容器的概念跟 VM 不大一樣,學習上並不是那麼容易,這也需要考慮。
如果想用 Docker 會有 Linux 的限制,那我們能不能用 Vagrant 裝 Docker 就好了?當然可以,這個方法唯一的缺點是,因為多了一層 layer ,所以 port 轉接與資料夾同步,都需要做兩層,另外速度也會慢了一點點,不過這些問題在開發階段都好處理,應該只要注意一下即可。
Vagrant 與 Docker 各有它們的好用之處,但主要目的都是為了快速建置一個可拋式環境,讓開發人員與維運人員可以安心做測試與佈署的練習。只要練習的夠多次,上線的風險自然就比較小。同時這也是開發如何考慮維運的實際做法唷!